package main

import (
	"fmt"
	"github.com/sirupsen/logrus"
	"io"
	"os"
)

// MyHook结构体用于定义自定义的日志钩子。
type MyHook struct {
}

// Levels方法返回此钩子支持的所有日志级别。
func (hook MyHook) Levels() []logrus.Level {
	return logrus.AllLevels
}

// Fire方法在日志事件触发时执行自定义逻辑。
func (hook MyHook) Fire(entry *logrus.Entry) error {
	fmt.Println("hi")
	entry.Data["app"] = "logrus"
	return nil
}

// main函数是程序的入口点。
// 本程序演示了如何使用logrus库进行日志记录。
func main() {
	// 创建或打开日志文件，以便将日志输出到文件中。
	file, _ := os.OpenFile("logrus.info.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	// 设置日志输出目标为日志文件和标准输出。
	logrus.SetOutput(io.MultiWriter(file, os.Stdout))
	// 启用报告调用者信息，以便在日志中显示调用位置。
	logrus.SetReportCaller(true)
	// 添加自定义钩子到日志记录器中。
	logrus.AddHook(&MyHook{})
	// 设置日志格式为JSON格式。
	logrus.SetFormatter(&logrus.JSONFormatter{})
	// 设置日志格式为带时间戳和颜色的文本格式。
	logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true,
		FullTimestamp:   true,
		TimestampFormat: "2006-01-02 03:04:05"})
	// 设置日志级别为TraceLevel，这样可以捕获所有类型的日志条目。
	logrus.SetLevel(logrus.TraceLevel)

	// 输出不同级别的日志示例。
	logrus.Error("Debug")   // 错误日志级别
	logrus.Warnln("Debug")  // 警告日志级别
	logrus.Info("Debug")    // 信息日志级别
	logrus.Debugf("Debug")  // 调试日志级别
	logrus.Println("Debug") // 通用信息日志输出

	// 使用WithField方法添加上下文信息到日志条目中。
	log := logrus.WithField("app", "app1").WithField("version", "1.1")
	log.Debug("msg-1") // 输出带有上下文信息的调试日志

	// 使用WithFields方法一次性添加多个上下文信息到日志条目中。
	log = logrus.WithFields(logrus.Fields{"app": "app2", "version": "2.2"})
	log.Debug("msg-2") // 输出带有新的上下文信息的调试日志
}
